/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.radaction.DAO;

import br.com.radaction.DTO.Curso;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *  Classe para conectar com o SGBD e fazer as operações de CRUD
 * Create,Retrieve,Update e Delete
 * @author robson
 */
public class CursoDAO {

    private Connection conexao;

    /**
     * Construtor único, para garantir a existência de uma conexão com um SGBD
     * @param conexao Connection já aberta com um SGBD
     */
    public CursoDAO(Connection conexao) {
        this.conexao = conexao;
    }

    /**
     * Se o curso for válido, este método irá fazer o INSERT no SGBD.
     * O Código será inserido pela Sequência e será colocado novamente no objeto Curso
     * @param curso Curso a ser inserido
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public void create(Curso curso) throws SQLException {
        if (this.valida(curso)) {
            String query = "INSERT INTO CURSO (COD,NOME)" +
                    "VALUES (NEXTVAL('seqCurso'),?)";
            PreparedStatement pst = this.conexao.prepareStatement(query);
            pst.setString(1, curso.getNome());
            pst.executeUpdate();
            Statement st = this.conexao.createStatement();
            ResultSet rs = st.executeQuery("SELECT CURRVAL('seqCurso')");
            if (rs.next()) {
                curso.setCod(rs.getInt(1));
            }
            rs.close();
            st.close();
            pst.close();
        }
    }

    /**
     * Retorna o curso do SGBD de acordo com o código do curso recebido.
     * @param curso Curso a ser carregado do SGBD
     * @return Curso do SGBD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public Curso retrieve(Curso curso) throws SQLException {
        Curso cursoRet = new Curso();
        String sql = "SELECT COD,NOME FROM CURSO WHERE COD=?";
        PreparedStatement pst = this.conexao.prepareStatement(sql);
        pst.setInt(1, curso.getCod());
        ResultSet rs = pst.executeQuery();
        if (rs.next()) {
            cursoRet.setCod(rs.getInt("COD"));
            cursoRet.setNome(rs.getString("NOME"));
        }
        rs.close();
        pst.close();
        return cursoRet;
    }

    /**
     * Atualiza o Curso do SGBD.
     * @param curso Curso a ser atualizado no SGBD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public void update(Curso curso) throws SQLException {
        if (this.valida(curso)) {
            String sql = "UPDATE CURSO SET NOME=? WHERE COD=?";
            PreparedStatement pst = this.conexao.prepareStatement(sql);
            pst.setString(1, curso.getNome());
            pst.setInt(2, curso.getCod());
            pst.executeUpdate();
            pst.close();
        }
    }

    /**
     * Remove do SGBD o curso conforme o código presente no curso passado como argumento
     * @param curso Curso a ser excluído. Necessita apenas do atributo COD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public void delete(Curso curso) throws SQLException {
        String query = "DELETE FROM CURSO WHERE COD=?";
        PreparedStatement pst = this.conexao.prepareStatement(query);
        pst.setInt(1, curso.getCod());
        pst.executeUpdate();
        pst.close();
    }

    /**
     * Retorna uma Lista com todos os Cursos cadastrados no SGBD.
     * @return Lista com os cursos
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public List<Curso> listaTodos() throws SQLException {
        List<Curso> lista = new ArrayList<Curso>();
        String query = "SELECT COD,NOME FROM CURSO ORDER BY NOME";
        Statement st = this.conexao.createStatement();
        ResultSet rs = st.executeQuery(query);
        while (rs.next()) {
            Curso curso = new Curso(rs.getInt("COD"));
            curso.setNome(rs.getString("NOME"));
            lista.add(curso);
        }
        rs.close();
        st.close();
        return lista;
    }

    /**
     * Aplica os testes para as regras de negócio. 
     * @param curso Curso a ser testado
     * @return true se o Curso atende as regras de negócio, ou false em caso contrário.
     */
    public boolean valida(Curso curso) {
        boolean ret = false;
        if (curso != null) {
            ret = true;
        }
        return ret;
    }
}
